Шаг 1 - Получение MAC адреса сетевой карты

Загрузить проект

Первое, что я хочу сказать по поводу этой темы. Я в ней совершенно не разбираюсь. То есть я делаю у себя сеть на предприятии на базе NT Server и она работает :-). Так же я считаю, что лучше понять как работает программное обеспечение можно только научившись программировать :-) все это обеспечение. Так что особенно не наезжайте :-). Это и мой первый шаг :-). Приму с большой благодарностью любую Вашу помошь и советы. Литературы по этому поводу не очень много. Давайте вместе .. А ?

MAC - Media Access Control это номер сетевой карты. Он зашивается в карту производителем и используется протоколами сети. Если у Вас NT, то Вы можете его увидеть вот как. Administrative tools -> Windows NT Diagnostic далее вкладка Network и кнопка Transport. Для решения этой задачи мы будем использовать функции Netbios. Вобщем мы попробуем, а потом я напишу поподробнее о NetBios.

1_1.gif (6206 b)

Создаем приложение Win 32 console с именем TestNet1 и выбираем Simple Application. Смотрим Project setting и далее Link все, что там есть нам не надо. А поместить туда надо - Netapi32.lib.

Чтож давайте писать:-) ещебы знать чего. Ну надо знать заголовочный файл для этой библиотеки. Нам нужен NB30.H. Но он не будет компилироваться без windows.h в нем есть куча объявлений типа UCHAR и так далее. Вот на данную минуту как должны выглядеть объявления.

#include "stdafx.h"
#include "windows.h"
#include "NB30.h"
Нам нужна структура сетевого управляющего блока. Имя этой структуры NCB. Она содержит данные о каманде, буфер для сообщений и так далее. Вот она.
typedef struct _NCB 
    { // ncb 
    UCHAR  ncb_command; 
    UCHAR  ncb_retcode; 
    UCHAR  ncb_lsn;    
    UCHAR  ncb_num;    
    PUCHAR ncb_buffer; 
    WORD   ncb_length; 
    UCHAR  ncb_callname[NCBNAMSZ]; 
    UCHAR  ncb_name[NCBNAMSZ];     
    UCHAR  ncb_rto; 
    UCHAR  ncb_sto; 
    void (*ncb_post) (struct _NCB *);    
    UCHAR  ncb_lana_num; 
    UCHAR  ncb_cmd_cplt;    
    UCHAR  ncb_reserve[10];
    HANDLE ncb_event; 
} NCB; 
Объявим её у себя в программе. Так как на основе этой структуры производится общение с интерфейсом NetBios.
	NCB	ncb;
Дальше под эту структуру нам надо выделить память.
memset( &ncb, 0, sizeof(ncb) ); 
А вот теперь поместим в структуру команду NCBRESET. Эта команда очищает имена и сеансы связи. Заканчивает невыполненные команды.

Теперь в структуре нужно определить адаптерный номер LAN. Мы поставим 0.

    ncb.ncb_command = NCBRESET;
    ncb.ncb_lana_num = 0; 
Результат выполнения команды возвращается в переменную, которую нужно объявить.
 UCHAR uRetCode; 
После подготовки данных и переменных можно выполнить команду NetBios
uRetCode = Netbios((NCB*) &ncb );
Код возврата должен быть 0 при нормальном выполнении команды. Его мы и проверим.
	if ( uRetCode != 0 )  
	{
		cout << "error NCBRESET " << endl;
		exit(1);
	}
Для получения адреса используется команда NCBASTAT с параметром - "*". Только перед заполнением блока лучше его обнулить.
    ncb.ncb_command = NCBASTAT;
    ncb.ncb_lana_num = 0;    
   _mbscpy( ncb.ncb_callname,(UCHAR*)"*               ");
Подотовим структуру под информацию
typedef struct _ASTAT_
{    
    ADAPTER_STATUS adapt;
    NAME_BUFFER    NameBuff [30];
}Adapter;
Скажем, что буфер это структура адаптера и укажем длину
 	Adapter a1;
	ncb.ncb_buffer = (unsigned char *) &a1; 
	ncb.ncb_length = sizeof(a1);
Так как всё готово можно вызвать команду
uRetCode = Netbios((NCB*) &ncb );
И теперь, если все нормально, то есть код возврата и можно посмотреть адрес адаптера.
	if ( uRetCode == 0 )  
	{
		printf( "The Ethernet Number is: %02x%02x%02x%02x%02x%02x\n",
                a1.adapt.adapter_address[0],
                a1.adapt.adapter_address[1],
                a1.adapt.adapter_address[2],
                a1.adapt.adapter_address[3],
                a1.adapt.adapter_address[4],
                a1.adapt.adapter_address[5] ); 
	}
Вот результат работы.

1_2.gif (2003 b)

Как видите он полностью совпадает с результатами работы NT.

Полный код программы загрузите из проекта. А выводы такие. Работа с NetBios производится заполнением структур NCB с указанием команды и параметров. Вызывается функция NetBios, если возвращается результат, то в буфер. При удачном выпонениии код возврата 0.

Работает это под NT под Windows 95, проверял.

Hosted by uCoz